package org.dromara.easytl.ast;

/**
 * 抽象语法树节点基类
 * 所有AST节点都继承自此类
 * 
 * @author EasyTL Team
 */
public abstract class ASTNode {
    
    /** 节点在源代码中的位置信息 */
    protected Position position;
    
    /**
     * 默认构造函数，位置信息为未知
     */
    protected ASTNode() {
        this.position = Position.unknown();
    }
    
    /**
     * 带位置信息的构造函数
     * 
     * @param position 位置信息
     */
    protected ASTNode(Position position) {
        this.position = position != null ? position : Position.unknown();
    }
    
    /**
     * 获取节点的位置信息
     * 
     * @return 位置信息
     */
    public Position getPosition() {
        return position;
    }
    
    /**
     * 设置节点的位置信息
     * 
     * @param position 位置信息
     */
    public void setPosition(Position position) {
        this.position = position != null ? position : Position.unknown();
    }
    
    /**
     * 获取起始行号
     * 
     * @return 起始行号（从1开始）
     */
    public int getStartLine() {
        return position.getStartLine();
    }
    
    /**
     * 获取起始列号
     * 
     * @return 起始列号（从1开始）
     */
    public int getStartColumn() {
        return position.getStartColumn();
    }
    
    /**
     * 获取结束行号
     * 
     * @return 结束行号（从1开始）
     */
    public int getEndLine() {
        return position.getEndLine();
    }
    
    /**
     * 获取结束列号
     * 
     * @return 结束列号（从1开始）
     */
    public int getEndColumn() {
        return position.getEndColumn();
    }
    
    /**
     * 接受访问者访问（访问者模式）
     * 
     * @param visitor 访问者对象
     * @return 访问结果
     */
    public abstract <T> T accept(ASTVisitor<T> visitor);
}

